package peace.graphic
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.DisplayObject;
import flash.display.GradientType;
import flash.display.Shape;
import flash.events.Event;
import flash.geom.Matrix;
import flash.geom.Point;
import flash.geom.Rectangle;
/**
 * "Отражение" любого DisplayObject. Тупо копия низа с градиентом. 
 */
public class Reflection extends Bitmap
{
	public var target:DisplayObject;
	public var size:Number;
	
	public function Reflection(target:DisplayObject=null, size:Number = 100)
	{
		super();
		this.target = target;
		this.size = size;
		redraw ();
		
		addEventListener(Event.REMOVED_FROM_STAGE, onStage, false,0,true);
	}
	
	public function redraw ():void
	{
		if (bitmapData && width>0 && height>0)
		{
			bitmapData.dispose();
		}
		if (!target)
		{
			return;
		}
		// область отрезания от target
		var r:Rectangle = new Rectangle(0, target.height-size, target.width, size);
		// БД - маска
		var alphaGradientBD:BitmapData = new BitmapData(r.width, r.height, true, 0x00000000);
		var gradientMatrix: Matrix = new Matrix();
		var gradientShape: Shape = new Shape();
		gradientMatrix.createGradientBox(r.width, r.height, Math.PI/2, 0,0);
		gradientShape.graphics.beginGradientFill(GradientType.LINEAR, [0xFFFFFF, 0xFFFFFF], 
			[0, 0.5], [0, 255], gradientMatrix);
		gradientShape.graphics.drawRect(0,0, r.width, r.height);
		gradientShape.graphics.endFill();
		alphaGradientBD.draw(gradientShape);
		// БД - ввырезка из target
		var targetBD:BitmapData = new BitmapData(r.width, r.height, true, 0x00000000);
		targetBD.draw(target, new Matrix(1,0,0,1,-r.x,-r.y));

		bitmapData = new BitmapData(r.width, r.height, true, 0x00000000);									
		bitmapData.copyPixels(targetBD, targetBD.rect, new Point(), alphaGradientBD);
		// переворачиваем
		scaleY = -1;
		// выставляем, чтобы якобы было в 0,0
		y = r.height;
	} 
	/**
	 * При удалении со сцены грохаем картинку 
	 */	
	private function onStage (e:Event):void
	{
		if (bitmapData && width>0 && height>0)
		{
			bitmapData.dispose();
		}
	}
	
}
}